package org.yang.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.yang.reggie.common.R;
import org.yang.reggie.common.ValidateCodeUtils;
import org.yang.reggie.entity.User;
import org.yang.reggie.service.UserService;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author 缘友一世
 * date 2023/7/12-9:56
 */
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;
    //获取验证码
    @PostMapping("/sendMsg")
    public R<String> sendMsg(HttpSession session, @RequestBody User user){
        //获取邮箱号
        //相当于发送短信定义的String to
        String email = user.getEmail();
        String subject = "瑞吉外卖";
        //StringUtils.isNotEmpty字符串非空判断
        if (StringUtils.isNotEmpty(email)) {
            //发送一个四位数的验证码,把验证码变成String类型
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            String text = "【瑞吉外卖】您正在邮箱登录，登录验证码为：" + code + "，请按页面提示提交验证码，切勿将验证码泄露于他人。";
            log.info("验证码为：" + code);
            //发送短信
            userService.sendMsg(email,subject,text);

            // 设置验证码的过期时间为1分钟（以毫秒为单位）
            //long expirationTime = System.currentTimeMillis() + (60* 1000); // 60 seconds

            //将验证码保存到session当中
            //session.setAttribute(email,code);

            // 将验证码和过期时间保存到会话中，使用邮箱地址作为键
            //session.setAttribute(email, new VerificationCode(code, expirationTime));

            //将生成的验证码缓存到redis中，并且设置有效时间为5分钟
            redisTemplate.opsForValue().set(email,code,3, TimeUnit.MINUTES);

            return R.success("验证码发送成功");
        }
        return R.error("验证码发送异常，请重新发送");
    }
    //登录
    @PostMapping("/login")
    //Map存JSON数据
    public R<User> login(HttpSession session, @RequestBody Map map){
        //获取邮箱，用户输入的
        String email = map.get("email").toString();
        //获取验证码，用户输入的
        String code = map.get("code").toString();
        //获取session中保存的验证码
        //Object sessionCode = session.getAttribute(email);

        // 获取验证码和过期时间
        //VerificationCode verificationCode = (VerificationCode) session.getAttribute(email);
        //从redis中获取缓存验证码
        String codeInRedis = (String)redisTemplate.opsForValue().get(email);

        // 检查验证码是否存在并且未过期
        // 验证码不存在或已过期
        if (codeInRedis == null) {
            return R.error("验证码已过期，请重新发送");

        }else{
            // 验证码未过期，继续验证登录逻辑
            //如果session的验证码和用户输入的验证码进行比对,&&同时
            //if (sessionCode != null && sessionCode.equals(code)) {
            if (codeInRedis.equals(code)) {
                //要是User数据库没有这个邮箱则自动注册,先看看输入的邮箱是否存在数据库
                LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
                queryWrapper.eq(User::getEmail,email);
                //获得唯一的用户，因为邮箱号是唯一的
                User user = userService.getOne(queryWrapper);
                //要是User数据库没有这个邮箱则自动注册
                if (user == null) {
                    user = new User();
                    user.setEmail(email);
                    user.setStatus(1);
                    //取邮箱的前五位为用户名
                    user.setName(email.substring(0,6));
                    userService.save(user);
                }
                //不保存这个用户名就登不上去，因为过滤器需要得到这个employee才能放行，程序才知道你登录
                session.setAttribute("employee", user.getId());
                //删除redis中的验证码
                redisTemplate.delete(email);

                return R.success(user);
            }
        }
        return R.error("登录失败");
    }

    /**
     * 退出登录
     * @param session
     * @return
     */
    @PostMapping("logout")
    public R<String> logout(HttpSession session) {
        session.removeAttribute("employee"); // 从session中移除用户信息
        return R.success("注销成功");
    }

}

